package com.safe.ele.service.impl;//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼            BUG辟易  

import com.safe.ele.config.RedisKeyConfig;
import com.safe.ele.config.SystemConfig;
import com.safe.ele.dao.IUserDao;
import com.safe.ele.dto.IUserDto;
import com.safe.ele.entity.IUser;
import com.safe.ele.service.intf.IUserService;
import com.safe.ele.util.*;
import com.safe.ele.vo.R;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * 佛曰：笑着面对，不去埋怨。悠然，随心，随性，随缘。注定让一生改变的，只在百年后，那一朵花开的时间。
 * 《庄子·知北游》：“人生天地之间；若白驹之过隙；忽然而已。”
 * 我说：一切都会过去的，一切都会到来的，在时间面前我们都是弟弟！！！
 * 死循环-----死循环-----死循环---2020.12.18
 * 一鼓作气，再而衰，三而竭！-----2020.12.28
 *
 * @author 张涂涂
 * @date:Created in 2021/1/13 14:26
 */
@Service
public class IUserServiceImpl implements IUserService {
    @Autowired
    private IUserDao iUserDao;
    @Value("${scode.passkey}")//把密钥注入
    private String key;

    /**
     * 检验手机号的可用性
     *
     * @param phone
     * @return
     */
    @Override
    public R checkPhone(String phone) {
        if (StringUtil.isNoEmpty(phone)) {
            //再检验手机号是否已经注册
            IUser user = iUserDao.selectUserByPhone(phone);
            if (user == null) {
                //可用
                return R.ok();
            }
        }
        return R.fail();
    }

    @Override
    public R register(IUserDto iUserDto) {
        //再次校验手机号的可用性
        if (StringUtil.isNoEmpty(iUserDto.getPhone(), iUserDto.getPassword())) {
            //校验手机号是否唯一性
            if (iUserDao.selectUserByPhone(iUserDto.getPhone()) == null) {
                //能用则对密码进行加密
                if (StringUtil.isNoEmpty(key)) {
                    iUserDto.setPassword(EncryptUtil.aesenc(key, iUserDto.getPassword()));
                    //建一个user的对象，把手机号和密码传进去
                    IUser user = new IUser(iUserDto.getPhone(), iUserDto.getPassword());

                    //把这个含有账号和密码的user添加到数据库中通过userDao方法
                    if (iUserDao.insert(user) > 0) {
                        return R.ok();
                    }
                }
            }
        }
        return R.fail();
    }

    @Override
    public R login(IUserDto dto) {
        if (dto != null) {
            if (StringUtil.isNoEmpty(dto.getPhone(), dto.getPassword())) {
                IUser user = iUserDao.selectUserByPhone(dto.getPhone());
//检验用户是否能可用----------状态int-------String比较
                //给user设置一个默认的状态为字符串1
                if (user!=null && user.getStatus().equals(SystemConfig.LOGIN_OK) ) {
//                    if (user!=null && user.getStatus().equals(SystemConfig.LOGIN_OK) ) {
                    //如果这个密码==通过密钥加密后的密码
                    if(user.getPassword().equals(EncryptUtil.aesenc(key,dto.getPassword()))){
//创建一个手机登录的密钥
                        String phoneKey = RedisKeyConfig.LOGIN_PHONE+dto.getPhone();
                        if(RedissonUtil.isHave(phoneKey)){
                            String tk = RedissonUtil.getStr(phoneKey);
                            //删除原先的令牌
                            RedissonUtil.delKeys(RedisKeyConfig.LOGIN_TOKEN+tk);

                            RedissonUtil.setHash(RedisKeyConfig.LOGIN_OUT,tk,"亲，您在"+ DateUtil.getTime()+"在其他设备已经登录");
                        }

//                        //创建一个新的令牌
                        String token = JwtUtil.createToken(user.getPhone());
                        //存储Redis String 有效期 Key: val:

                        //这是两个key
                        //令牌---用户的关系      token令牌
                        RedissonUtil.setStr(RedisKeyConfig.LOGIN_TOKEN+token,new JSONObject(user).toString(),RedisKeyConfig.LOGIN_TOKEN_TIMES);
                       //令牌和手机号，通过手机号验证是否为登录状态-------------------------直接存储令牌就好了
                        RedissonUtil.setStr(RedisKeyConfig.LOGIN_PHONE+dto.getPhone(),token,RedisKeyConfig.LOGIN_TOKEN_TIMES);
                        return R.ok(token);
                    }
                }
            }
        }
        return R.fail();
    }
}
